package com.gs.view.uscite;

import java.util.Date;
import java.util.Observable;
import java.util.Vector;

import android.app.DatePickerDialog;
import android.app.Dialog;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import com.gs.Controllore;
import com.gs.R;
import com.gs.business.AltreUtil;
import com.gs.business.DBUtil;
import com.gs.business.IAggiornatoreModel;
import com.gs.business.cache.CacheCategorie;
import com.gs.business.cache.CacheUscite;
import com.gs.business.comadi.uscite.CommandDeleteSpesa;
import com.gs.business.comadi.uscite.CommandInserisciSpesa;
import com.gs.business.comadi.uscite.CommandUpdateSpesa;
import com.gs.domain.CatSpese;
import com.gs.domain.SingleSpesa;
import com.gs.domain.wrapper.WrapSingleSpesa;
import com.gs.view.impostazioni.CategorieView;
import com.gs.view.riepilogo.ListaUscite;
import comi.gsi.command.CommandManager;

public class UsciteView extends AbstractUsciteView implements IAggiornatoreModel {

	protected DatePickerDialog.OnDateSetListener mDateSetListener = null;
	@SuppressWarnings("unused")
	private DatePickerDialog calendario = null;
	private final EditText data = null;
	private final EditText nome = null;
	private final EditText descrizione = null;
	private final EditText euro = null;
	private final Spinner listaTipi = null;
	private final Button inserisciOaggiorna = null;
	private final Button viewOrCanc = null;
	private ArrayAdapter<CatSpese> arrayAdapter = null;

	@Override
	protected void myOnCreate(final Bundle savedInstanceState) {

		final Intent i = getIntent();
		final int prova = i.getIntExtra("idUscita", 0);

		initForSpecificUse(prova);

		getData().setText(getDay() + "/" + getMonth() + "/" + getYear());
		getData().setOnTouchListener(new View.OnTouchListener() {

			@Override
			public boolean onTouch(final View v, final MotionEvent event) {
				calendario = (DatePickerDialog) onCreateDialog(0);
				showDialog(0);
				return true;
			}
		});

		mDateSetListener = new DatePickerDialog.OnDateSetListener() {

			@Override
			public void onDateSet(final DatePicker view, final int year, final int monthOfYear, final int dayOfMonth) {
				setYear(year);
				setMonth(monthOfYear);
				setDay(dayOfMonth);
				updateDisplay();

			}
		};
		getListaTipi().setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

			@Override
			public void onItemSelected(final AdapterView<?> adapterView, final View view, final int arg2, final long arg3) {

				final TextView textView = ((TextView) view);
				if (textView.getText().equals("new...")) {
					final Intent i = new Intent(view.getContext(), CategorieView.class);
					startActivity(i);
				}
			}

			@Override
			public void onNothingSelected(final AdapterView<?> arg0) {
			}
		});
		getInserisciOaggiorna().setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(final View v) {
				//deve essere clonata la spesa prima di aggiornare il model dalla vista altrimenti resterebbero uguali
				final SingleSpesa clonata = ((SingleSpesa) getModelUscita().getEntitaPadre()).clona();
				aggiornaModelDaVista();
				if (getInserisciOaggiorna().getText().equals("Aggiorna")) {
					final SingleSpesa nuova = (SingleSpesa) getModelUscita().getEntitaPadre();
					final CommandUpdateSpesa updateUscita = new CommandUpdateSpesa(clonata, nuova);
					if (CommandManager.getIstance().invocaComando(updateUscita)) {
						Toast.makeText(UsciteView.this, "Uscita aggiornata correttamente", Toast.LENGTH_SHORT).show();
					}
				} else if (getInserisciOaggiorna().getText().equals("Inserisci")) {
					final int idUscita = (CacheUscite.getSingleton().getMaxId()) + 1;
					getModelUscita().setidSpesa(idUscita);
					final CommandInserisciSpesa insSpesa = new CommandInserisciSpesa(getModelUscita());
					if (CommandManager.getIstance().invocaComando(insSpesa)) {
						Toast.makeText(UsciteView.this, "Uscita inserita correttamente", Toast.LENGTH_SHORT).show();
					}
				}

			}
		});
		getViewOrCanc().setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(final View v) {
				if (getViewOrCanc().getText().equals("Visualizza")) {
					final Intent i = new Intent(v.getContext(), ListaUscite.class);
					v.getContext().startActivity(i);
				} else if (getViewOrCanc().getText().equals("Elimina")) {
					aggiornaModelDaVista();
					CommandDeleteSpesa cancEntrata = new CommandDeleteSpesa((SingleSpesa) getModelUscita().getEntitaPadre());
					if (CommandManager.getIstance().invocaComando(cancEntrata)) {
						Toast.makeText(UsciteView.this, "Entrata eliminata correttamente", Toast.LENGTH_SHORT).show();
					}
				}
			}
		});
	}

	public CatSpese[] getArrayCategorie() {
		final Vector<CatSpese> cat = CacheCategorie.getSingleton().getVettoreCategoriePerCombo();
		final CatSpese catspese = new CatSpese();
		catspese.setnome("new...");
		cat.add(catspese);
		final CatSpese[] categorie = cat.toArray(new CatSpese[cat.size()]);
		return categorie;
	}

	@Override
	public void update(final Observable arg0, final Object arg1) {
		if (getNome() != null & modelUscita.getNomeEntita() != null) {
			getNome().setText(modelUscita.getNomeEntita());
		}
		if (getDescrizione() != null & modelUscita.getdescrizione() != null) {
			getDescrizione().setText(modelUscita.getdescrizione());
		}
		if (getData() != null & modelUscita.getData() != null) {
			getData().setText(modelUscita.getData());
		}
		if (getEuro() != null & modelUscita.getinEuro() != 0) {
			getEuro().setText(Double.toString(modelUscita.getinEuro()));
		}
		if (getListaTipi() != null & modelUscita.getCatSpese() != null) {
			getListaTipi().setSelection(arrayAdapter.getPosition(modelUscita.getCatSpese()));
		}
	}

	@Override
	protected int getIdLayout() {
		return R.layout.uscite;
	}

	public void initForSpecificUse(final int prova) {
		final CatSpese[] categorie = getArrayCategorie();
		arrayAdapter = new ArrayAdapter<CatSpese>(this, android.R.layout.simple_spinner_item, categorie);
		getListaTipi().setAdapter(arrayAdapter);

		if (prova != 0) {
			final SingleSpesa uscita = CacheUscite.getSingleton().getSingleSpesa(Integer.toString(prova));
			this.setModelUscita(new WrapSingleSpesa(uscita));
			update(getModelUscita(), null);
			getInserisciOaggiorna().setText("Aggiorna");
			getViewOrCanc().setText("Elimina");
		} else {
			getInserisciOaggiorna().setText("Inserisci");
			setModelUscita(new WrapSingleSpesa());
		}
	}

	@Override
	protected Dialog onCreateDialog(final int id) {
		return new DatePickerDialog(this, mDateSetListener, getYear(), getMonth(), getDay());
	}

	protected void updateDisplay() {
		data.setText(new StringBuilder().append(getMonth() + 1).append("/").append(getDay()).append("/").append(getYear()).append(""));
	}

	@Override
	public boolean onCreateOptionsMenu(final Menu menu) {
		super.onCreateOptionsMenu(menu);
		menu.add(0, 0, 0, "Lista Uscite");
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(final MenuItem item) {
		super.onOptionsItemSelected(item);
		if (item.getItemId() == 0) {
			//			final Intent i = new Intent(UsciteView.this, ListaUscite.class);
			//			(UsciteView.this).startActivity(i);
		}
		return true;
	}

	@Override
	public void aggiornaModelDaVista() {

		setcNome(getNome().getText().toString());

		setcDescrizione(getDescrizione().getText().toString());

		setCategoria((CatSpese) getListaTipi().getSelectedItem());

		if (AltreUtil.checkData(getData().getText().toString(), "/")) {
			setcData(getData().getText().toString());
		} else {
			Toast.makeText(UsciteView.this, "Data nel formato non corretto", Toast.LENGTH_SHORT);
		}
		if (AltreUtil.checkDouble(getEuro().getText().toString())) {
			final Double euroo = Double.parseDouble(getEuro().getText().toString());
			setdEuro(AltreUtil.arrotondaDecimaliDouble(euroo));
		} else {
			Toast.makeText(UsciteView.this, "Valore non nel formato corretto", Toast.LENGTH_SHORT);
		}
		setUtenti(Controllore.getUtenteLogin());
		setDataIns(DBUtil.dataToString(new Date(), "yyyy/MM/dd"));
	}

	public boolean nonEsistonoCampiNonValorizzati() {
		return getNome().getText() != null && getDescrizione().getText() != null && getData().getText() != null && getEuro().getText() != null && getListaTipi().getSelectedItem() != null;
	}

	public EditText getData() {
		return (EditText) lazyLoad(data, R.id.dDataUscita);
	}

	public EditText getNome() {
		return (EditText) lazyLoad(nome, R.id.cNomeUscita);
	}

	public EditText getDescrizione() {
		return (EditText) lazyLoad(descrizione, R.id.cDescrizioneUscita);
	}

	public EditText getEuro() {
		return (EditText) lazyLoad(euro, R.id.nEuro);
	}

	public Spinner getListaTipi() {
		return (Spinner) lazyLoad(listaTipi, R.id.lCategorie);
	}

	public Button getInserisciOaggiorna() {
		return (Button) lazyLoad(inserisciOaggiorna, R.id.btnInserisciUscite);
	}

	public Button getViewOrCanc() {
		return (Button) lazyLoad(viewOrCanc, R.id.btnVisualizzaUscite);
	}
}
